package com.jml.手写数据库连接池;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;

public class ConnectionPool implements IConnectionPool {
	// 空闲线程集合
	private List<Connection> freeConnection = new Vector<Connection>();
	// 活动线程集合
	private List<Connection> activeConnection = new Vector<Connection>();
	// 记录线程总数  原子类防止并发
	AtomicInteger countConne = new AtomicInteger(0);

	private DbBean dbBean;

	public ConnectionPool(DbBean dbBean) {
		this.dbBean = dbBean;
		init();
	}

	public void init() {
		//获取初始化线程连接数
		for (int i = 0; i < dbBean.getInitConnections(); i++) {
			//创建连接
			Connection newConnection = newConnection();
			if (newConnection != null) {
				// 添加到空闲线程中...
				freeConnection.add(newConnection);
			}
		}
	}
	// 创建新的Connection
	private Connection newConnection() {
		try {
			if (dbBean == null) {
				return null;
			}
			Class.forName(dbBean.getDriverName());
			Connection connection = DriverManager.getConnection(dbBean.getUrl(), dbBean.getUserName(),
					dbBean.getPassword());
			countConne.incrementAndGet();
			return connection;
		} catch (Exception e) {
			return null;
		}
	}
	//得到连接
	public synchronized Connection getConnection() {
		//判断当前已经创建的线程连接是否大于最大活动线程数，如果大于最大线程数,则进行等待...
		Connection connection = null;
		try {
			if (countConne.get() < dbBean.getMaxActiveConnections()) {
				// 还有活动线程可以使用
				// * ####2.判断空闲线程数是否大于0 如果空闲线程数<0，创建新的连接
				if (freeConnection.size() > 0) {
					connection = freeConnection.remove(0);// 等于freeConnection.get(0);freeConnection.remove(0);
				} else {
					// 创建新的连接
					connection = newConnection();
				}
				//判断连接是否可用
				boolean available = isAvailable(connection);
				if (available) {
					//连接可用就加入活动线程
					activeConnection.add(connection);
				} else {
					//连接不可用就删除这个连接然后再创建一个连接
					countConne.decrementAndGet();// i--操作
					connection = getConnection();// 递归调用getConnection方法
				}
			} else {
				// 大于最大线程数,进行等待,重新获取连接
				wait(dbBean.getConnTimeOut());
				connection = getConnection();// 递归调用getConnection方法
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		// * ####3.如果空闲线程数>0，则获取当前空闲线程,存入在活动线程集合中 <br>
		return connection;
	}

	// 判断连接是否可用
	public boolean isAvailable(Connection connection) {
		try {
			if (connection == null || connection.isClosed()) {
				return false;
			}
		} catch (Exception e) {
		}
		return true;
	}
	//释放资源
	public void releaseConnection(Connection connection) {
		try {
			if (connection == null) {
				return;
			}
			if (isAvailable(connection)) {
				// 判断空闲线程数是否大于空闲池的最大线程数
				if (freeConnection.size() < dbBean.getMaxConnections()) {
					freeConnection.add(connection);
				} else {
					// 空闲线程数已经满了
					connection.close();
					countConne.decrementAndGet();
				}
				activeConnection.remove(connection);
				//countConne.decrementAndGet();
				notifyAll();
			}
		} catch (Exception e) {
		}
	}
}

